package learn.up.java.thread;

/**    
 *     	当使用ThreadLocal维护变量时，ThreadLocal为每个使用该变量的线程提供独立的变量副本，
 *     	所以每一个线程都可以独立地改变自己的副本，而不会影响其它线程所对应的副本。
 * 概括起来说，对于多线程资源共享的问题，同步机制采用了“以时间换空间”的方式，
 * 而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量，让不同的线程
 * 排队访问，而后者为每一个线程都提供了一份变量，因此可以同时访问而互不影响。
 * @author JuWa ▪ Zhang
 * @date 2017年11月24日
 */
public class ThreadLocalDemo {

	private static ThreadLocal<Integer> demo = new ThreadLocal<Integer>() {

		@Override
		protected Integer initialValue() {
			return 0;
		}
	};
	
	public Integer getNum() {
		demo.set(demo.get() + 1);
		return demo.get();
	}
	public static void main(String[] args) {
		ThreadLocalDemo demo = new ThreadLocalDemo();
		TestClient c1 = new TestClient(demo);
		TestClient c2 = new TestClient(demo);
		TestClient c3 = new TestClient(demo);
		c1.start();
		c2.start();
		c3.start();
	}
	
	private static class TestClient extends Thread {
		
		private ThreadLocalDemo demo;
		
		public TestClient( ThreadLocalDemo demo) {
			this.demo = demo;
		}
		@Override
		public void run() {
			for (int i = 0; i < 5; i ++) {
				System.out.println(Thread.currentThread().getName() + " num = "+demo.getNum());
			}
		}
		
	}
}
